/*
 * Guarda la informacion de los procesos que se van a cargar en
 * el sistema, una vez que se haya leido el XML de entrada.
 * Ademas es observador del Timer, de modo que esta preparado
 * cuando en cada TICK tenga que agregarse algun proceso
 */

package Estructuras;
import java.util.Observable;
import java.util.Observer;
import java.util.LinkedList;
import java.util.ListIterator;

/**
 *
 * @author Cesar Hernandez
 */
public class InitialProcessList implements Observer, Runnable {

    /*
     * IMPORTANTE: lista_inicial representa la lista AGREGADA con todos,
     * TODOS los procesos del XML (se limita solo a tener esa informacion).
     * En cambio, proximos_creados puede ser 0, 1 o varios procesos que
     * por el contador de Timer saben que ahora deben ejecutarse en el 
     * sistema.
     */
    private LinkedList<Task_struct> lista_inicial;
    private task_list proximos_creados;
    private int tick_actual;
    private task_list sched_list; // Referencia al scheduler con su lista.

    public InitialProcessList(LinkedList<Task_struct> li, task_list sl){

        this.lista_inicial = li;
        proximos_creados = new task_list();
        tick_actual = 0;
        this.sched_list = sl;
    }

      //metodo que se ejecuta al momento de que el objeto observado cambie
      //o1 es el valor pasado por parametro en la this.notifyObservers

    public void update(Observable o, Object tick) {

      this.tick_actual = ((Integer) tick).intValue();
      System.out.println("InitialProcessList recibe senal");
      Thread hiloIniPro = new Thread(this);
      hiloIniPro.start();

    }

    public boolean lookNexts(){

        int tamini = lista_inicial.size();
        int tamfinal;

        ListIterator<Task_struct> it = lista_inicial.listIterator();

        while(it.hasNext()){

            Task_struct tarea = it.next();
            if (tarea.getArrivalTime() == tick_actual){

                proximos_creados.Insert(tarea);
                it.remove();
            }
        }
        
        if (proximos_creados != null){
            sched_list.append(proximos_creados);
            proximos_creados = null;
            return true;
        }else{
            return false;
        }
    }

    public void run(){

        if (lookNexts()){
            System.out.println("Llegaron nuevos procesos...");
        }
    }
}
